发布于 

夺宝奇兵 [思维题]

夺宝奇兵 [思维题]

Wannafly Day 3 A

题目来源:comet OJ

分析

这道题的关键在于依次从\(1\)\(n\)然后从\(n\)\(1\)。我们只考虑从\(i\)\(i+1\)的情况,因为我们可以发现不同的\(i\)之间是不会相互干扰的,那么:当我们的\(i\)已确定时,我们只需要选择距离最近的\(i+1\)即可。但我们要令\(i\)\(i+1\)和后来的从\(i+1\)回到\(i\)的距离之和最小,那么只需要组合一下,取和最小的情况即可。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <algorithm>

#define MAXN 100100

using namespace std;

int x[MAXN][2], y[MAXN][2];

int calc(int i, int j)
{
if (j)
return abs(x[i+1][0] - x[i][0]) + abs(x[i+1][1] - x[i][1]) + abs(y[i+1][0] - y[i][0]) + abs(y[i+1][1] - y[i][1]);
else
return abs(x[i+1][0] - x[i][1]) + abs(x[i+1][1] - x[i][0]) + abs(y[i+1][0] - y[i][1]) + abs(y[i+1][1] - y[i][0]);
}

int main()
{
int n, m;
cin >> n >> m;

for (int i = 1; i<=n; i++)
{
cin >> x[i][0] >> y[i][0];
cin >> x[i][1] >> y[i][1];
}

long long ans = 0;
for (int i = 1; i<n; i++)
ans += min( calc(i,0), calc(i,1) );

ans += abs(x[n][0] - x[n][1]) + abs(y[n][0] - y[n][1]);

cout << ans << endl;
}

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

本站由 [@Songer](https://blog.songer.xyz/) 创建,使用 Stellar 作为主题。